home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / oscar / ssi / SSIItem.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  14KB  |  410 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. from util.primitives import odict
  6. import traceback
  7. import struct
  8. import oscar
  9. import contacts
  10. from util.observe import list_notify
  11. import warnings
  12. import logging
  13. from oscar.OscarBuddies import OscarBuddy
  14. from traceback import print_stack
  15. import common
  16. from contacts import Contact
  17. log = logging.getLogger('oscar.ssiitem')
  18.  
  19. class OscarContact(Contact):
  20.     _renderer = 'Contact'
  21.     inherited_actions = [
  22.         OscarBuddy]
  23.     
  24.     def __init__(self, *a, **k):
  25.         Contact.__init__(self, *a, **k)
  26.         self.ssis = self.protocol.ssimanager.ssis
  27.  
  28.     
  29.     def get_remote_alias(self):
  30.         
  31.         try:
  32.             friendly = self.ssis[self.id].get_alias().decode('fuzzy utf-8')
  33.             if self.buddy._friendly_name is None:
  34.                 self.buddy._friendly_name = friendly
  35.             
  36.             return friendly
  37.         except KeyError:
  38.             return None
  39.  
  40.  
  41.     
  42.     def set_remote_alias(self, newname):
  43.         self.protocol.set_remote_alias(self, newname)
  44.  
  45.     remote_alias = property(get_remote_alias, set_remote_alias)
  46.     
  47.     def rename_gui(self):
  48.         s = Contact.rename_gui(self)
  49.         if s is not None:
  50.             self.remote_alias = s
  51.         
  52.  
  53.     rename_gui = common.action()(rename_gui)
  54.     
  55.     def block(self, *a, **k):
  56.         return Contact.block(self, *a, **k)
  57.  
  58.     block = common.action(Contact._block_pred)(block)
  59.     
  60.     def unblock(self, *a, **k):
  61.         return Contact.unblock(self, *a, **k)
  62.  
  63.     unblock = common.action(Contact._unblock_pred)(unblock)
  64.  
  65.  
  66. class SSIItem(object):
  67.     
  68.     def __init__(self, name, group_id, item_id, type_ = None, tlvs = None, **k):
  69.         if not isinstance(name, str):
  70.             raise TypeError('SSIItem.name must be str, not %s' % type(name))
  71.         
  72.         type_ = k.pop('type', type_)
  73.         if k:
  74.             raise Exception('Only one extra keyword argument ("type") is allowed for SSIItems')
  75.         
  76.         self.name = name
  77.         self.group_id = group_id
  78.         self.item_id = item_id
  79.         if not type_:
  80.             pass
  81.         self.type = 0
  82.         if not tlvs:
  83.             pass
  84.         self.tlvs = odict({ })
  85.         self.c8_to_ints()
  86.  
  87.     
  88.     def set_name(self, name):
  89.         if not isinstance(name, str):
  90.             raise TypeError('setting SSIItem.name to something that is not str: %s' % type(name))
  91.         
  92.         self._name = name
  93.  
  94.     
  95.     def get_name(self):
  96.         return self._name
  97.  
  98.     name = property(get_name, set_name)
  99.     
  100.     def tlv_tuple(self):
  101.         return (self.group_id, self.item_id)
  102.  
  103.     tlv_tuple = property(tlv_tuple)
  104.     
  105.     def to_bytes(self):
  106.         tlvs_string = ''
  107.         for type, val in self.tlvs.items():
  108.             if type != 200:
  109.                 if hasattr(val, 'value'):
  110.                     tlvs_string += oscar.util.tlv(val.type, val.length, val.value)
  111.                 else:
  112.                     tlvs_string += oscar.util.tlv(type, val)
  113.             hasattr(val, 'value')
  114.             type += ''.join([], []([ struct.pack('!H', short) for short in val ]))
  115.         
  116.         nlen = len(self.name)
  117.         tlen = len(tlvs_string)
  118.         return struct.pack('!H%dsHHHH%ds' % (nlen, tlen), nlen, self.name, self.group_id, self.item_id, self.type, tlen, tlvs_string)
  119.  
  120.     
  121.     def c8_to_ints(self):
  122.         if 200 in self.tlvs and isinstance(self.tlvs[200], basestring):
  123.             self.tlvs[200] = oscar.unpack((('list', 'list', 'H'),), self.tlvs[200])[0]
  124.         
  125.  
  126.     
  127.     def clone(self):
  128.         return oscar.unpack((('ssi', 'ssi'),), self.to_bytes())[0]
  129.  
  130.     
  131.     def add_item_to_group(self, id_to_add, position = 0):
  132.         if self.type != 1:
  133.             raise AssertionError(repr(self) + ' is not a group')
  134.         else:
  135.             self.tlvs.setdefault(200, []).insert(position, id_to_add)
  136.  
  137.     
  138.     def remove_item_from_group(self, id_to_remove):
  139.         if self.type != 1:
  140.             raise AssertionError(repr(self) + ' is not a group')
  141.         
  142.         
  143.         try:
  144.             self.tlvs.setdefault(200, [
  145.                 id_to_remove]).remove(id_to_remove)
  146.         except ValueError:
  147.             pass
  148.  
  149.         if not self.tlvs[200]:
  150.             del self.tlvs[200]
  151.         
  152.  
  153.     
  154.     def get_item_position(self, id_to_find):
  155.         if self.type != 1:
  156.             raise AssertionError(repr(self) + ' is not a group')
  157.         
  158.         
  159.         try:
  160.             return self.tlvs.get(200, []).index(id_to_find)
  161.         except ValueError:
  162.             return None
  163.  
  164.  
  165.     
  166.     def move_item_to_position(self, id_to_move, position):
  167.         curposition = self.get_item_position(id_to_move)
  168.         if curposition is None:
  169.             raise AssertionError(repr(self) + ' does not contain %d' % id_to_move)
  170.         
  171.         if position != curposition:
  172.             self.remove_item_from_group(id_to_move)
  173.             self.add_item_to_group(id_to_move, position)
  174.         
  175.  
  176.     
  177.     def get_alias(self):
  178.         return self.tlvs.get(305, None)
  179.  
  180.     
  181.     def set_alias(self, alias):
  182.         if alias:
  183.             self.tlvs[305] = alias
  184.         else:
  185.             self.remove_alias()
  186.  
  187.     
  188.     def remove_alias(self):
  189.         self.remove_tlv(305)
  190.  
  191.     alias = property(get_alias, doc = 'this is the alias of the buddy')
  192.     
  193.     def get_comment(self):
  194.         return self.tlvs.get(316, None)
  195.  
  196.     
  197.     def set_comment(self, comment):
  198.         if comment:
  199.             self.tlvs[316] = comment
  200.         else:
  201.             self.remove_comment()
  202.  
  203.     
  204.     def remove_comment(self):
  205.         self.remove_tlv(316)
  206.  
  207.     comment = property(get_comment, doc = 'this is the comment about the buddy')
  208.     
  209.     def remove_tlv(self, type):
  210.         
  211.         try:
  212.             del self.tlvs[type]
  213.         except KeyError:
  214.             pass
  215.  
  216.  
  217.     
  218.     def __repr__(self):
  219.         return '<SSI Item: name: %s, group_id: %d, item_id: %d, type: %d>' % (self.name, self.group_id, self.item_id, self.type)
  220.  
  221.  
  222.  
  223. class OscarSSIs(dict):
  224.     
  225.     def __init__(self, manager):
  226.         self.manager = manager
  227.         self.root_group = SSIGroup(None, self.manager)
  228.         self.groups = {
  229.             (0, 0): self.root_group }
  230.         return dict.__init__(self)
  231.  
  232.     
  233.     def __setitem__(self, key, ssi, modify = False):
  234.         tupled_key = tuple_key(ssi)
  235.         if isinstance(key, SSIItem):
  236.             pass
  237.         
  238.         if ssi.type == 1:
  239.             self.root_group.frozen().__enter__()
  240.             
  241.             try:
  242.                 if tupled_key in self.groups:
  243.                     self.groups[tupled_key].set_ssi(ssi)
  244.                 else:
  245.                     self.groups[tupled_key] = SSIGroup(ssi, self.manager)
  246.             finally:
  247.                 pass
  248.  
  249.         elif modify and ssi.type == 0:
  250.             if 348 in ssi.tlvs or 349 in ssi.tlvs:
  251.                 self.manager.o.get_buddy_info(ssi)
  252.             
  253.         
  254.         return dict.__setitem__(self, tupled_key, ssi)
  255.  
  256.     
  257.     def get_group(self, key):
  258.         return self.groups[tuple_key(key)]
  259.  
  260.     
  261.     def __getitem__(self, key):
  262.         return dict.__getitem__(self, tuple_key(key))
  263.  
  264.     
  265.     def __contains__(self, key):
  266.         return dict.__contains__(self, tuple_key(key))
  267.  
  268.     
  269.     def __delitem__(self, key):
  270.         return dict.__delitem__(self, tuple_key(key))
  271.  
  272.     
  273.     def update(self, hash, modify = False):
  274.         self.root_group.frozen().__enter__()
  275.         
  276.         try:
  277.             for k, v in hash.items():
  278.                 self.__setitem__(k, v, modify = modify)
  279.         finally:
  280.             pass
  281.  
  282.  
  283.     
  284.     def fix_group_c8(self):
  285.         groups = _[1]
  286.         for g_id, i_id in groups:
  287.             known_locs = dict((lambda .0: for x, y in .0:
  288. (y, x))(enumerate(gm_ids)))
  289.             locations = { }
  290.             for possible in m_ids:
  291.                 if possible in known_locs:
  292.                     locations[possible] = known_locs[possible]
  293.                     continue
  294.                 
  295.                 inverted = struct.unpack('<H', struct.pack('>H', possible))[0]
  296.                 if inverted in known_locs:
  297.                     locations[possible] = known_locs[inverted]
  298.                     continue
  299.                 
  300.                 locations[possible] = len(m_ids)
  301.             
  302.             new_gm_ids = sorted(m_ids, key = locations.__getitem__)
  303.             self[(g_id, i_id)].tlvs[200] = new_gm_ids
  304.         
  305.  
  306.  
  307.  
  308. def tuple_key(key):
  309.     if isinstance(key, int):
  310.         return (key, 0)
  311.     
  312.     if isinstance(key, SSIItem):
  313.         return (key.group_id, key.item_id)
  314.     
  315.     if isinstance(key, tuple) and len(key) == 2 and isinstance(key[0], int) and isinstance(key[1], int):
  316.         return key
  317.     
  318.     raise AssertionError(repr(key) + ' is not a valid ssi key')
  319.  
  320.  
  321. class SSIGroup(contacts.Group):
  322.     _renderer = 'Group'
  323.     
  324.     def __init__(self, new_ssi, ssi_manager):
  325.         self.my_ssi = new_ssi
  326.         self.ssi_manager = ssi_manager
  327.         if self.my_ssi is None:
  328.             self.my_ssi = SSIItem('root', 0, 0, 1)
  329.         
  330.         groupname = self.my_ssi.name.decode('utf-8', 'replace')
  331.         contacts.Group.__init__(self, groupname, ssi_manager.o, self.my_ssi.group_id)
  332.  
  333.     
  334.     def set_ssi(self, new_ssi):
  335.         oldname = self.my_ssi.name
  336.         self.my_ssi = new_ssi
  337.         self.name = self.my_ssi.name.decode('utf-8', 'replace')
  338.         if oldname != self.name:
  339.             self.notify('name', oldname, self.name)
  340.         
  341.  
  342.     
  343.     def __getitem__(self, index):
  344.         g_id = self.my_ssi.group_id
  345.         tlv = self.my_ssi.tlvs.get(200, [])
  346.         start_index = index
  347.         ssi = None
  348.         while ssi is None:
  349.             
  350.             try:
  351.                 i_id = tlv[index]
  352.             except IndexError:
  353.                 break
  354.  
  355.             if g_id:
  356.                 
  357.                 try:
  358.                     ssi = self.ssi_manager.ssis[(g_id, i_id)]
  359.                 except KeyError:
  360.                     e = None
  361.                     index += 1
  362.                     continue
  363.  
  364.                 return OscarContact(self.ssi_manager.o.buddies[ssi.name], (g_id, i_id))
  365.                 continue
  366.             return self.ssi_manager.ssis.get_group((i_id, 0))
  367.         if ssi is None:
  368.             warnings.warn('Error finding SSI %r in group (id=%r)' % (start_index, g_id))
  369.             raise IndexError('SSI Item not found in group(id=%r): %r', index, g_id)
  370.         
  371.  
  372.     
  373.     def __iter__(self):
  374.         for i in xrange(len(self)):
  375.             
  376.             try:
  377.                 yield self[i]
  378.             continue
  379.             except (KeyError, IndexError):
  380.                 continue
  381.                 continue
  382.             
  383.  
  384.         
  385.  
  386.     
  387.     def online(self):
  388.         return bool(self.num_online)
  389.  
  390.     online = property(online)
  391.     
  392.     def num_online(self):
  393.         ss = self.ssi_manager.ssis
  394.         bs = self.ssi_manager.o.buddies
  395.         total = 0
  396.         g_id = self.my_ssi.group_id
  397.         tlv = self.my_ssi.tlvs.get(200, [])
  398.         return total
  399.  
  400.     num_online = property(num_online)
  401.     
  402.     def find(self, obj):
  403.         return list.find(self, obj)
  404.  
  405.     
  406.     def __len__(self):
  407.         return len(self.my_ssi.tlvs.get(200, []))
  408.  
  409.  
  410.